Modos de pasar variables como argumentos
Cuando pasamos variables a una función o subrutina en OpenOffice Basic se pueden utilizar las siguientes modalidades:
Pasar la variable por referencia
Es el modo por defecto de pasar una variable a una función o subrutina. Al pasar la variable por referencia, no se pasa una copia de la variable a la función o subrutina, sino que se pasa como un enlace directo a la variable.
En este caso, cualquier cambio que se realice sobre la variable dentro de la función o subrutina se verá reflejado en la función o subrutina que la llamó, pues en realidad, se están aplicando los cambios a la propia variable.
Como hemos dicho, es el modo de por defecto, pero se puede especificar agregando la instrucción ByRef en la declaración de los argumentos.
Sub Cuenta() Dim n As Integer Incrementa n Msgbox n ' Obtendremos 1, pues la variable se pasó por referencia End Sub Sub Incrementa( ByRef nValor as Integer ) nValor = nValor + 1 End Sub
Este código es equivalente a este otro, pues como hemos dicho, el modo ByRef es el modo por defecto.
Sub Cuenta() Dim n As Integer Incrementa n Msgbox n ' Obtendremos 1, pues la variable se pasó por referencia End Sub Sub Incrementa( nValor as Integer ) nValor = nValor + 1 End Sub
Pasar la variable por valor
Al pasar la variable por valor, se pasa una copia de la variable a la función o subrutina, por lo que en éstas se creará una copia independiente de la variable.
Por lo tanto, cualquier cambio que se realice sobre la variable dentro de la función o subrutina no se verá reflejado en la función o subrutina que la llamó, pues en realidad, son variables distintas.
Para especificar el modo por valor se agregará la instrucción ByVal en la declaración de los argumentos.
Sub Cuenta() Dim n As Integer Incrementa n Msgbox n ' Obtendremos 0, pues la variable se pasó por valor End Sub Sub Incrementa( ByVal nValor as Integer ) nValor = nValor + 1 End Sub
Definir un argumento como opcional
Se pueden definir los argumentos de una función o subrutina como opcionales. Si los argumentos son opcionales, no es obligatorio pasar esos argumentos a la función o subrutina.
Para especificar que un argumento es opcional se agregará la instrucción Optional en la declaración de los argumentos. Todos los argumentos que sigan al primero declarado como opcional deberán ser declarados como opcionales también.
Para detectar si un argumento opcional ha sido o no pasado a la función o subrutina se utiliza la función IsMissing, que devuelve True si el argumento no ha sido pasado, o False si el argumento si ha sido pasado.
El uso de IsMissing nos permite definir un argumento por defecto para el caso de que ese argumento opcional no sea pasado a la función o subrutina.
Sub PintaFecha() Dim d As Date d = Date()-5 ' cinco días antes de la fecha actual Msgbox FormateaFecha(d) End Sub Function FormateaFecha( dFecha as Date, optional cFormato as string) If IsMissing( cFormato ) then cFormato = "dddd, dd \d\e mmmm \d\e yyyy" FormateaFecha = Format( dFecha, cFormato ) End Function
Pasar argumentos como una matriz de parámetros
En otros dialectos de Basic se pueden pasar a una función o subrutina un número indeterminado de argumentos que son capturados por ésta en una matriz mediante la instrucción ParamArray.
La instrucción ParamArray no se puede utilizar en OpenOffice Basic salvo que se active la directiva del compilador Option Compatible, como se muestra en el siguiente ejemplo:
REM ***** BASIC ***** Option Explicit Option Compatible Sub Pinta() msgbox MatrizDeParametros( 1,2,3,4,5) End Sub Function MatrizDeParametros( ParamArray x()) as integer Dim n as integer, r as integer For n=0 to uBound(x) r = r + x(n) next MatrizDeParametros = r End Function
La matriz de parámetros debe ser obligatoriamente el último argumento declarado en la función o subrutina.